/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.servicios;

import com.ec.socialfun.entidades.Evento;
import com.ec.socialfun.entidades.Local;
import com.ec.socialfun.entidades.Sucursal;
import com.ec.socialfun.entidades.Usuario;
import com.ec.socialfun.entidades.UsuarioSucursal;
import com.ec.socialfun.excepciones.CreacionSucursalException;
import com.ec.socialfun.excepciones.CrearArchivoException;
import com.ec.socialfun.servicios.externos.FtpServicio;
import com.ec.socialfun.util.Consulta;
import com.ec.socialfun.util.ConsultasUtil;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.jboss.logging.Logger;

/**
 *
 * @author hp
 */
@Stateless
public class SucursalFacade extends AbstractFacade<Sucursal> {

    private static final Logger LOG = Logger.getLogger(SucursalFacade.class.getName());
    @PersistenceContext(unitName = "SocialFunPU")
    private EntityManager em;
    @EJB
    private FtpServicio ftpServicio;
    @EJB
    private UsuarioSucursalFacade usuarioSucursalFacade;
    @EJB
    private EventoFacade eventoFacade;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public SucursalFacade() {
        super(Sucursal.class);
    }

    /**
     * recupera las sucursales mediante el envio de parametros en el objeto
     * consulta
     *
     * @param consulta
     * @return
     */
    public Consulta recuperarSucursales(Consulta consulta) {

        // consulta para conteo total de datos
        StringBuilder sbContador = new StringBuilder();
        sbContador.append("SELECT COUNT(s) FROM Sucursal s");

        // consulta obtencio de datos
        StringBuilder sbConsulta = new StringBuilder();
        sbConsulta.append("SELECT s FROM Sucursal s");

        if (!consulta.getFiltro().isEmpty()) {
            String condiciones = ConsultasUtil.armarCondiciones(consulta.getFiltro());
            sbContador.append(condiciones);
            sbConsulta.append(condiciones);
        }

        if (consulta.getColumnaOrdenar() != null && consulta.getTipoDeOrdenamiento() != null) {
            sbConsulta.append(" ORDER BY ").append(consulta.getColumnaOrdenar()).append(" ").append(consulta.getTipoDeOrdenamiento().getCodigo());
        }
        LOG.info("sbContador = " + sbContador.toString());
        LOG.info("sbConsulta = " + sbConsulta.toString());

        Query q = em.createQuery(sbContador.toString());
        consulta.setContador((Long) q.getSingleResult());

        q = em.createQuery(sbConsulta.toString());
        q.setFirstResult(consulta.getPrimerRegistro());
        q.setMaxResults(consulta.getTamanoPagina());
        consulta.setLista(q.getResultList());

        return consulta;
    }

    /**
     * crea y activa sucursal por defecto para el usuario LOCAL
     *
     * @param local
     * @param usuario
     * @throws CreacionSucursalException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void creaYActivaSucursal(Local local, Usuario usuario) throws CreacionSucursalException {
        try {
            Sucursal sucursal = new Sucursal();
            sucursal.setLoCodigo(local);
            sucursal.setSuLatitud(0.0);
            sucursal.setSuLonguitud(0.0);
            sucursal.setSuDescripcion("INSERTE DESCRIPCION");
            sucursal.setZoCodigo(usuario.getZoCodigo());
            sucursal.setSuDireccion("INSERTE DIRECCION");
            sucursal.setSuNombre("S/N");
            sucursal.setSuCapacidad("0");
            sucursal.setSuHorarioDesde("00:00");
            sucursal.setSuHorarioHasta("00:00");
            sucursal.setSuDiaAtencionDesde("LUNES");
            sucursal.setSuDiaAtencionHasta("VIERNES");
            this.create(sucursal);

            UsuarioSucursal usuSucursal = new UsuarioSucursal();
            usuSucursal.setUsCodigo(usuario);
            usuSucursal.setSuCodigo(sucursal);
            usuarioSucursalFacade.create(usuSucursal);
            
            ftpServicio.crearFicheroImagenesSucursalFtp(sucursal, true);
            ftpServicio.crearFicheroImagenesProductoFtp(local);

        } catch (CrearArchivoException e) {
            LOG.error(" Error en la creacion del fichero al momento de  crear y activar sucursal " + e);
            throw new CreacionSucursalException(" Error en la creacion del fichero al momento de  crear y activar sucursal");
        } catch (Exception e) {
            LOG.error(" Error al crear sucursal" + e);
            throw new CreacionSucursalException(" Error error al crear sucursal");
        }
    }

    /**
     * recupera sucursal por codigo
     *
     * @param codigo
     * @return
     */
    public Sucursal recuperarPorCodigo(Integer codigo) {
        Query q = em.createNamedQuery("Sucursal.findBySuCodigo");
        q.setParameter("suCodigo", codigo);
        return (Sucursal) q.getSingleResult();
    }

    /**
     * recuepera las sucursales asignadas al usuario
     *
     * @param mail
     * @return
     */
    public List<Sucursal> recuperaPorUsuario(String mail) {
        StringBuilder sb = new StringBuilder();
        sb.append("SELECT us.suCodigo FROM UsuarioSucursal us");
        sb.append(" WHERE us.usCodigo.usCorreo = :usCorreo ");
        Query q = em.createQuery(sb.toString());
        q.setParameter("usCorreo", mail);
        return q.getResultList();

    }

    /**
     * crea y activa sucursal desde la administracion de sucrusales
     *
     * @param sucursal
     * @param usuario
     * @throws CreacionSucursalException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void creaYActivaSucursal(Sucursal sucursal, Usuario usuario) throws CreacionSucursalException {
        try {
            this.create(sucursal);
            UsuarioSucursal usuarioSucursal = new UsuarioSucursal();
            usuarioSucursal.setSuCodigo(sucursal);
            usuarioSucursal.setUsCodigo(usuario);
            usuarioSucursalFacade.create(usuarioSucursal);
            ftpServicio.crearFicheroImagenesSucursalFtp(sucursal, false);
        } catch (Exception e) {
            LOG.error("Error al crear y activar sucursar " + e);
            throw new CreacionSucursalException("Error al crear sucursal ");
        }
    }

    /**
     * recupera lista de imagenes de local y eventos de la sucursal
     *
     * @param local
     * @return
     */
    public List<String> recuperaListaDeImagenesPorLocal(Sucursal sucursal) {
        List<String> listaFotos = new ArrayList<String>();
        try {
            Local local = sucursal.getLoCodigo();
            if (local.getLoImagen() != null && local.getLoImagen().trim().length() != 0) {
                LOG.info(" imagen local " + local.getLoCodigo());
                listaFotos.add(local.getLoImagen());
            }
            List<Evento> listaEventos = eventoFacade.recuperaEventoPorSucursalYFecha(sucursal, local);
            LOG.info(" sucursal " + sucursal.getSuCodigo());
            for (Evento evento : listaEventos) {
                if (evento.getEvFoto() != null && evento.getEvFoto().trim().length() != 0) {
                    listaFotos.add(evento.getEvFoto());
                }
            }
            return listaFotos;
        } catch (Exception ex) {
            LOG.error("Error al recuperar eventos por sucursal y fecha " + ex);
            return listaFotos;
        }
    }
}
